grammar BooleanExpressionTree;

options {
  output=AST;
}

tokens {
  NODE_BOOL_EXPR;
  NODE_OR;
  NODE_AND;
}

@parser::header {
    package ru.serggt1;
}

@lexer::header {
    package ru.serggt1;
}

boolExpr	
	: boolOr -> ^( NODE_BOOL_EXPR boolOr )
	;
	
boolOr 	: ( boolAnd ( OR boolAnd )* ) -> ^( NODE_OR boolAnd+ )
	;
	
boolAnd
	: ( boolAtom ( AND boolAtom )* ) -> ^( NODE_AND boolAtom+ )
	;
	
boolAtom
	: ( TRUE | FALSE )
	| LP ( expr=boolExpr -> $expr ) RP
	;
	
LP :	'(' ;
RP :	')' ;

AND 	:	'and' ;
OR	:	'or' ;
NOT	:	'not' ;

TRUE	:	'true' ;
FALSE	:	'false' ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ 	{ $channel = HIDDEN; } ;

